import numpy as np
import plotly as pt
import numba as nm
from numba import jit

## 使用逃逸时间算法给出当前点的迭代次数, 使用Jit优化
@jit(nm.int64(nm.complex128,nm.int64,nm.complex128))
def cnt_julia(z,n,c):
    ## 设置当前迭代次数
    cnt = 0
    ## 验证
    temp = 0
    for i in range(n):
        ## 进行一次迭代
        cnt += 1
        temp = z
        z = z*z + c
        ## 判断当前迭代项是否仍在Julia集中
        if abs(z)>2:
            return cnt
    ## 当前点在Julia集中
    return cnt

## 生成对应矩形区域内Julia集的迭代次数矩阵
def generate_Julia_in_dec(c,z1,z2,N=100,f = lambda x:x):
    ## 输入两个复数作为矩形区域对角与迭代次数N, 区域内分割尺度默认为2000
    if(type(z1)!=complex or type(z1)!=complex):
        print("Error: 输入区域格式错误")
    if(type(N)!=int):
        print("Error: 输入迭代次数有误")
    ## 处理区域
        ## 处理起点与步长
    x = sorted([z1.real, z2.real])
    y = sorted([z1.imag, z2.imag])
    dx = (x[1]-x[0])/2000
    dy = (y[1]-y[0])/2000
    x = x[0]
    y = y[0]
        ## 设置标签矩阵
    lx = []
    ly = []
    ## 生成迭代次数矩阵
    obj = np.zeros((2001,2001))
    for i in range(obj.shape[0]):
        temp = x
        for j in range(obj.shape[1]):
            if(i==0):
                lx.append(x)
            obj[i,j] = f(cnt_julia(complex(x,y), N,c))
            x += dx
        x = temp
        y += dy
        ly.append(y)
    return obj,lx,ly




    